package com.wzy.activiti02;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.repository.ProcessDefinitionQuery;
import org.apache.commons.io.IOUtils;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * 需求:
 * 从Activiti bytearry表中读取两个资源文件
 * 将两个资源文件保存到G:\1\A路径下
 * 方案:
 * 1.第一中方式使用actviti的api来说实现
 * 2.第二种方式: 原理层面,可以使用jdbc对blob类型,clob类型数据的读取,并保存
 * 3.IO流转换,最好使用commons-io.jar包可以轻松解决IO操作
 * 应用场景:用户想查看这个请假流程具体有哪些步骤
 */
public class QueryBpmnFile {
    public static void main(String[] args) throws IOException {
        //1.得到processEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2.得到RepositoryService对象
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //3.得到查询器: ProcessDefinitionQuery
        ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
        //4.设置条件
        processDefinitionQuery.processDefinitionKey("holiday");//参数流程定义的key
        //5.执行查询操作,查询出想要的流程定义
        ProcessDefinition processDefinition = processDefinitionQuery.singleResult();
        //6.通过流程定义信息,得到部署的id号
        String deploymentId = processDefinition.getDeploymentId();
        //7.通过repositoryService的方法,实现读取图片信息以及bpmn文件信息(输入流)
        //getResourceAsStream,方法参数说明:第一个参数代表的是:部署id,第二个参数代表资源名称
        //processDefinition.getDiagramResourceName(),代表获取png图片资源的名称
        //processDefinition.getResourceName(),代表获取bpmn文件的名称
        InputStream pngIs = repositoryService
                .getResourceAsStream(deploymentId, processDefinition.getDiagramResourceName());
        InputStream bpmnIs = repositoryService
                .getResourceAsStream(deploymentId, processDefinition.getResourceName());
        //8.构造出outputStream流
        OutputStream pngOs = new FileOutputStream("G:\\1\\2\\" + processDefinition.getDiagramResourceName());
        OutputStream bpmnOs = new FileOutputStream("G:\\1\\2\\" + processDefinition.getResourceName());
        //9.输入流,输出流的转换,使用commons-io 进行操作
        IOUtils.copy(pngIs, pngOs);
        IOUtils.copy(bpmnIs, bpmnOs);
        //.关闭流
        pngOs.close();
        bpmnOs.close();
        pngIs.close();
        bpmnIs.close();
    }

}
